home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
BBS-Archive
/
Comm
/
AmiTCP30b2.lha
/
src
/
netlib
/
_write.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-04
|
2KB
|
119 lines
RCS_ID_C="$Id: _write.c,v 1.4 1994/04/04 01:27:59 jraja Exp $";
/*
* _write.c --- write() for both files and sockets.
*
* Author: jraja <Jarno.Rajahalme@hut.fi>
*
* This file is part of the AmiTCP/IP Network Support Library.
*
* Copyright © 1994 AmiTCP/IP Group, <amitcp-group@hut.fi>
* Helsinki University of Technology, Finland.
* All rights reserved.
*
* Created : Tue Mar 8 22:43:57 1994 jraja
* Last modified: Wed Mar 30 10:17:32 1994 jraja
*
*/
#include <ios1.h>
#include <fcntl.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <errno.h>
#include <dos/dos.h>
#include <proto/dos.h>
#include <bsdsocket.h>
extern int __io2errno(long);
int
__write(int fd, const void *buffer, unsigned int length)
{
struct UFB *ufb;
int count, totcount;
char *ptr;
/*
* Check for the break signals
*/
__chkabort();
/*
* find the ufb *
*/
if ((ufb = __chkufb(fd)) == NULL) {
errno = EINVAL;
return -1;
}
/*
* Check if write is allowed
*/
if (!(ufb->ufbflg & UFB_WA)) {
_OSERR = ERROR_WRITE_PROTECTED;
errno = EIO;
return -1;
}
/*
* Seek to end of the file if necessary
*/
if (ufb->ufbflg & UFB_APP)
__lseek(fd, 0, 2);
/*
* Check if translation is not needed
*/
if (!(ufb->ufbflg & UFB_XLAT) ||
(ptr = memchr(buffer, 0x0A, length)) == NULL) {
if (ufb->ufbflg & UFB_SOCK) {
if ((count = send(fd, (char *)buffer, length, 0)) < 0)
return -1;
}
else {
if ((count = Write(ufb->ufbfh, (void *)buffer, length)) == -1)
goto osfail;
}
return count;
}
totcount = length;
/*
* Translate, ie., append CR before each LF
*/
do {
count = ptr - (char *)buffer;
if (ufb->ufbflg & UFB_SOCK) {
if (send(fd, (char *)buffer, count, 0) < 0)
return -1;
if (send(fd, "\015"/* CR */, 1, 0) < 0)
return -1;
}
else {
if (Write(ufb->ufbfh, (void *)buffer, count) == -1)
goto osfail;
if (Write(ufb->ufbfh, "\015"/* CR */, 1) == -1)
goto osfail;
}
length -= count;
buffer = ptr;
} while ((ptr = memchr((char *)buffer + 1, 0x0A, length)) != NULL);
if (ufb->ufbflg & UFB_SOCK) {
if ((count = send(fd, (char *)buffer, length, 0)) < 0)
return -1;
}
else {
if (Write(ufb->ufbfh, (void *)buffer, length) == -1)
goto osfail;
}
return totcount;
osfail:
errno = __io2errno(_OSERR = IoErr());
return -1;
}